{
 "cells": [
  {
   "cell_type": "code",
<<<<<<< HEAD
   "execution_count": 17,
=======
   "execution_count": 1,
>>>>>>> 081c522bdcef1cb40c539a5a14ec6d26a3b53059
   "metadata": {},
   "outputs": [],
   "source": [
    "import pandas as pd\n",
    "import numpy as np\n",
    "from tqdm import tqdm\n",
    "import csv\n",
    "import os\n",
    "import torch\n",
    "from torch.utils.data import Dataset\n",
    "import pickle\n",
    "from joblib import Parallel, delayed\n",
    "import random\n",
    "import datetime\n",
    "import operator\n",
    "from math import radians, cos, sin, asin, sqrt, floor, ceil\n",
    "from sklearn.model_selection import train_test_split\n",
    "import matplotlib.pyplot as plt"
   ]
  },
  {
   "cell_type": "code",
<<<<<<< HEAD
   "execution_count": 18,
   "metadata": {},
   "outputs": [],
   "source": [
    "port_info_path = '../../data/DataForModelB/port_info_dict_dump.file'\n",
    "\n",
    "train_data_by_order_path_folder = '../../data/DataForModelB/data_for_correct_test_onBoardDate/train_data_by_order'\n",
    "washed_train_order_brief_path = '../../data/DataForModelB/data_for_correct_test_onBoardDate/washed_train_order_brief.csv'\n",
    "model_for_correct_test_data_path = '../../data/DataForModelB/data_for_correct_test_onBoardDate/model_for_correct_test_data.pkl'"
=======
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "port_info_path = '../data/DataForModelB/port_info_dict_dump.file'\n",
    "\n",
    "train_data_by_order_path_folder = '../data/DataForModelB/data_for_correct_test_onBoardDate/train_data_by_order'\n",
    "washed_train_order_brief_path = '../data/DataForModelB/data_for_correct_test_onBoardDate/washed_train_order_brief.csv'\n",
    "model_for_correct_test_data_path = '../data/DataForModelB/data_for_correct_test_onBoardDate/model_for_correct_test_data.pkl'"
>>>>>>> 081c522bdcef1cb40c539a5a14ec6d26a3b53059
   ]
  },
  {
   "cell_type": "code",
<<<<<<< HEAD
   "execution_count": 19,
=======
   "execution_count": 3,
>>>>>>> 081c522bdcef1cb40c539a5a14ec6d26a3b53059
   "metadata": {},
   "outputs": [],
   "source": [
    "washed_train_order_brief = pd.read_csv(washed_train_order_brief_path)\n",
    "with open(port_info_path, \"rb\") as f:\n",
    "    port_data = pickle.load(f)\n",
    "\n",
    "# 将 GPS 时间单位转换为小时\n",
    "washed_train_order_brief['onboardDate'] = pd.to_datetime(washed_train_order_brief['onboardDate'], infer_datetime_format=True)\n",
    "base_dt = pd.to_datetime('1970/01/01 00:00:00Z')\n",
    "washed_train_order_brief['onboardDate'] = (washed_train_order_brief['onboardDate'] - base_dt).dt.total_seconds() / 3600"
   ]
  },
  {
   "cell_type": "code",
<<<<<<< HEAD
   "execution_count": 20,
=======
   "execution_count": 4,
>>>>>>> 081c522bdcef1cb40c539a5a14ec6d26a3b53059
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
<<<<<<< HEAD
      "100%|██████████| 12098/12098 [02:07<00:00, 94.78it/s] "
=======
      "100%|██████████| 453/453 [00:09<00:00, 47.69it/s]\n"
>>>>>>> 081c522bdcef1cb40c539a5a14ec6d26a3b53059
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
<<<<<<< HEAD
      "Train shape: torch.Size([9678, 8])\n",
      "Validtaion shape: torch.Size([2420, 8])\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\n"
=======
      "Train shape: torch.Size([362, 8])\n",
      "Validtaion shape: torch.Size([91, 8])\n"
>>>>>>> 081c522bdcef1cb40c539a5a14ec6d26a3b53059
     ]
    }
   ],
   "source": [
    "def haversine(lon1, lat1, lon2, lat2): # 经度1，纬度1，经度2，纬度2 （十进制度数）\n",
    "    # 将十进制度数转化为弧度\n",
    "    lon1, lat1, lon2, lat2 = map(radians, [lon1, lat1, lon2, lat2])\n",
    "    # haversine公式\n",
    "    dlon = lon2 - lon1 \n",
    "    dlat = lat2 - lat1 \n",
    "    a = sin(dlat/2)**2 + cos(lat1) * cos(lat2) * sin(dlon/2)**2\n",
    "    c = 2 * asin(sqrt(a)) \n",
    "    r = 6371 # 地球平均半径，单位为公里\n",
    "    return c * r\n",
    "def _handle_single_order_for_ModelForCorrect(loadingOrder):\n",
    "    # 获取 gps 数据并且截取 10%~50%\n",
    "    order_data_path = os.path.join(train_data_by_order_path_folder, \"{}_gps_data.csv\".format(loadingOrder))\n",
    "    order_gps = pd.read_csv(order_data_path, header=None,\n",
<<<<<<< HEAD
    "                                         names=['timestamp','longitude','latitude','speed'] )   \n",
=======
    "                                         names=['loadingOrder','timestamp','longitude','latitude','speed'] )   \n",
>>>>>>> 081c522bdcef1cb40c539a5a14ec6d26a3b53059
    "    order_gps['timestamp'] = pd.to_datetime(order_gps['timestamp'], infer_datetime_format=True)\n",
    "    order_gps['timestamp'] = (order_gps['timestamp'] - base_dt).dt.total_seconds() / 3600\n",
    "    order_gps_len = order_gps.shape[0]\n",
    "    total_ratio = random.uniform(0.1, 0.5)\n",
    "    start_ratio = random.uniform(0, 0.3)\n",
    "    order_gps = order_gps[floor(order_gps_len*start_ratio) : ceil(order_gps_len*(start_ratio+total_ratio))].reset_index(drop=True)\n",
    "    # 获取特征\n",
    "    speed_median = order_gps['speed'].median()\n",
    "    speed_mean = order_gps['speed'].mean()\n",
    "    speed_max_index, speed_max = max(enumerate(order_gps['speed']), key=operator.itemgetter(1))\n",
    "    speed_min_index, speed_min = min(enumerate(order_gps['speed']), key=operator.itemgetter(1))\n",
    "    if speed_max_index == speed_min_index:\n",
    "        acceleration = 0\n",
    "    else:\n",
    "        acceleration = (speed_max - speed_min) / abs(order_gps.loc[speed_max_index, 'timestamp'] - order_gps.loc[speed_min_index, 'timestamp'])\n",
    "    # 获取港口信息、第一个时间戳位置距离起航港口距离\n",
    "    order_brief = washed_train_order_brief[washed_train_order_brief['loadingOrder'] == loadingOrder].reset_index(drop=True)\n",
    "    TRANSPORT_TRACE = order_brief.loc[0, 'TRANSPORT_TRACE']\n",
    "    order_ports = TRANSPORT_TRACE.split(\"-\")\n",
    "    start_port = order_ports[0]\n",
    "    start_port_lon, start_port_lat = port_data[start_port]['LON'], port_data[start_port]['LAT']\n",
    "    distance = haversine(start_port_lon, start_port_lat, order_gps.loc[0, 'longitude'], order_gps.loc[0, 'latitude'])\n",
    "    # 货运公司ID\n",
    "    carrierName = order_brief.loc[0, 'carrierName']\n",
    "    # 需要修正的时间\n",
    "    label_y = order_gps.loc[0, 'timestamp'] - order_brief.loc[0, 'onboardDate']\n",
    "    return start_port_lon, start_port_lat, distance, carrierName, speed_median, speed_mean, speed_max, acceleration, label_y\n",
    "#     return start_port_lon, start_port_lat, distance, speed_median, speed_mean, speed_max, acceleration, label_y\n",
    "\n",
    "order_list = washed_train_order_brief['loadingOrder'].values\n",
    "\n",
    "# 截取每个订单的一部分路由\n",
    "# 【并行处理】，当作训练数据\n",
    "# train_x_origin = Parallel(n_jobs=8)(delayed(_handle_single_order_for_ModelForCorrect)\n",
    "#                                 (order)\n",
    "#                                 for order in tqdm(order_list))\n",
    "\n",
    "train_data = []\n",
    "for order in tqdm(order_list):\n",
    "    train_data.append(_handle_single_order_for_ModelForCorrect(order))\n",
    "\n",
    "train_data = pd.DataFrame(train_data, columns=['start_port_lon','start_port_lat','distance','carrierName', 'speed_median', 'speed_mean', 'speed_max', 'acceleration', 'label_y'])\n",
    "# train_data = pd.DataFrame(train_data, columns=['start_port_lon','start_port_lat','distance', 'speed_median', 'speed_mean', 'speed_max', 'acceleration', 'label_y'])\n",
    "features = [item for item in train_data.columns if item != 'label_y']\n",
    "\n",
    "# train validation 划分\n",
    "X_train, X_val, Y_train, Y_val = train_test_split(train_data[features], train_data['label_y'], test_size=0.2, random_state=1125)\n",
    "\n",
    "X_train, Y_train = torch.tensor(X_train.values).float(), torch.tensor(Y_train.values).float()\n",
    "X_val, Y_val = torch.tensor(X_val.values).float(), torch.tensor(Y_val.values).float()\n",
    "\n",
    "print(\"Train shape: {}\".format(X_train.shape))\n",
    "print(\"Validtaion shape: {}\".format(X_val.shape))"
   ]
  },
  {
   "cell_type": "code",
<<<<<<< HEAD
   "execution_count": 38,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>start_port_lon</th>\n",
       "      <th>start_port_lat</th>\n",
       "      <th>distance</th>\n",
       "      <th>carrierName</th>\n",
       "      <th>speed_median</th>\n",
       "      <th>speed_mean</th>\n",
       "      <th>speed_max</th>\n",
       "      <th>acceleration</th>\n",
       "      <th>label_y</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>114.133970</td>\n",
       "      <td>22.315195</td>\n",
       "      <td>9381.593353</td>\n",
       "      <td>1</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>0</td>\n",
       "      <td>-440933.880278</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>114.275347</td>\n",
       "      <td>22.577700</td>\n",
       "      <td>9132.095005</td>\n",
       "      <td>1</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>0</td>\n",
       "      <td>-440958.204444</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>114.275347</td>\n",
       "      <td>22.577700</td>\n",
       "      <td>8584.984337</td>\n",
       "      <td>1</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>0</td>\n",
       "      <td>-440958.204444</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>114.275347</td>\n",
       "      <td>22.577700</td>\n",
       "      <td>6740.987300</td>\n",
       "      <td>1</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>0</td>\n",
       "      <td>-441164.149167</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>114.275347</td>\n",
       "      <td>22.577700</td>\n",
       "      <td>8251.765781</td>\n",
       "      <td>1</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>0</td>\n",
       "      <td>-440958.204444</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>113.863058</td>\n",
       "      <td>22.559462</td>\n",
       "      <td>7069.425052</td>\n",
       "      <td>1</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>0</td>\n",
       "      <td>-440958.204444</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>113.863058</td>\n",
       "      <td>22.559462</td>\n",
       "      <td>6884.420555</td>\n",
       "      <td>1</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>0</td>\n",
       "      <td>-440958.204444</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>113.863058</td>\n",
       "      <td>22.559462</td>\n",
       "      <td>6766.630396</td>\n",
       "      <td>1</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>0</td>\n",
       "      <td>-440958.204444</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8</th>\n",
       "      <td>114.275347</td>\n",
       "      <td>22.577700</td>\n",
       "      <td>8686.503698</td>\n",
       "      <td>1</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>0</td>\n",
       "      <td>-440958.204444</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>9</th>\n",
       "      <td>113.863058</td>\n",
       "      <td>22.559462</td>\n",
       "      <td>7044.603356</td>\n",
       "      <td>1</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>0</td>\n",
       "      <td>-440958.204444</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>10</th>\n",
       "      <td>114.275347</td>\n",
       "      <td>22.577700</td>\n",
       "      <td>6452.721631</td>\n",
       "      <td>2</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>0</td>\n",
       "      <td>-441164.151111</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>11</th>\n",
       "      <td>113.863058</td>\n",
       "      <td>22.559462</td>\n",
       "      <td>8846.784561</td>\n",
       "      <td>3</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>0</td>\n",
       "      <td>-441115.159444</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>12</th>\n",
       "      <td>113.863058</td>\n",
       "      <td>22.559462</td>\n",
       "      <td>8898.597996</td>\n",
       "      <td>3</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>0</td>\n",
       "      <td>-441115.159444</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>13</th>\n",
       "      <td>114.275347</td>\n",
       "      <td>22.577700</td>\n",
       "      <td>9447.684705</td>\n",
       "      <td>4</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>0</td>\n",
       "      <td>-441124.892222</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>14</th>\n",
       "      <td>114.275347</td>\n",
       "      <td>22.577700</td>\n",
       "      <td>8260.702360</td>\n",
       "      <td>4</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>0</td>\n",
       "      <td>-441019.203333</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>15</th>\n",
       "      <td>114.275347</td>\n",
       "      <td>22.577700</td>\n",
       "      <td>8880.048909</td>\n",
       "      <td>4</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>0</td>\n",
       "      <td>-441019.203333</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>16</th>\n",
       "      <td>113.863058</td>\n",
       "      <td>22.559462</td>\n",
       "      <td>9852.285492</td>\n",
       "      <td>2</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>0</td>\n",
       "      <td>-440740.735556</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>17</th>\n",
       "      <td>113.863058</td>\n",
       "      <td>22.559462</td>\n",
       "      <td>12463.688045</td>\n",
       "      <td>5</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>0</td>\n",
       "      <td>-440972.325833</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>18</th>\n",
       "      <td>114.275347</td>\n",
       "      <td>22.577700</td>\n",
       "      <td>11234.436668</td>\n",
       "      <td>6</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>0</td>\n",
       "      <td>-440714.152778</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>19</th>\n",
       "      <td>114.275347</td>\n",
       "      <td>22.577700</td>\n",
       "      <td>6005.370977</td>\n",
       "      <td>7</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>0</td>\n",
       "      <td>-441164.154444</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>20</th>\n",
       "      <td>114.275347</td>\n",
       "      <td>22.577700</td>\n",
       "      <td>9122.493461</td>\n",
       "      <td>8</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>0</td>\n",
       "      <td>-441151.370833</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>21</th>\n",
       "      <td>121.643646</td>\n",
       "      <td>31.344022</td>\n",
       "      <td>7289.392611</td>\n",
       "      <td>6</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>0</td>\n",
       "      <td>-440923.397778</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>22</th>\n",
       "      <td>121.643646</td>\n",
       "      <td>31.344022</td>\n",
       "      <td>7164.135037</td>\n",
       "      <td>6</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>0</td>\n",
       "      <td>-440923.397778</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>23</th>\n",
       "      <td>113.863058</td>\n",
       "      <td>22.559462</td>\n",
       "      <td>9719.521929</td>\n",
       "      <td>9</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>0</td>\n",
       "      <td>-440999.717500</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>24</th>\n",
       "      <td>114.275347</td>\n",
       "      <td>22.577700</td>\n",
       "      <td>8794.886284</td>\n",
       "      <td>1</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>0</td>\n",
       "      <td>-440983.701111</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>25</th>\n",
       "      <td>114.275347</td>\n",
       "      <td>22.577700</td>\n",
       "      <td>9509.003399</td>\n",
       "      <td>1</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>0</td>\n",
       "      <td>-440983.701111</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>26</th>\n",
       "      <td>114.275347</td>\n",
       "      <td>22.577700</td>\n",
       "      <td>8940.389738</td>\n",
       "      <td>1</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>0</td>\n",
       "      <td>-440983.701111</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>27</th>\n",
       "      <td>114.275347</td>\n",
       "      <td>22.577700</td>\n",
       "      <td>8788.071666</td>\n",
       "      <td>1</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>0</td>\n",
       "      <td>-440983.701111</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>28</th>\n",
       "      <td>114.275347</td>\n",
       "      <td>22.577700</td>\n",
       "      <td>7823.185511</td>\n",
       "      <td>1</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>0</td>\n",
       "      <td>-440983.701111</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>29</th>\n",
       "      <td>113.863058</td>\n",
       "      <td>22.559462</td>\n",
       "      <td>9654.244750</td>\n",
       "      <td>3</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>0</td>\n",
       "      <td>-440643.030278</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>12068</th>\n",
       "      <td>113.863058</td>\n",
       "      <td>22.559462</td>\n",
       "      <td>9852.812495</td>\n",
       "      <td>1</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>0</td>\n",
       "      <td>-442273.961111</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>12069</th>\n",
       "      <td>114.275347</td>\n",
       "      <td>22.577700</td>\n",
       "      <td>9759.911936</td>\n",
       "      <td>19</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>0</td>\n",
       "      <td>-442274.929444</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>12070</th>\n",
       "      <td>113.863058</td>\n",
       "      <td>22.559462</td>\n",
       "      <td>8868.530498</td>\n",
       "      <td>1</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>0</td>\n",
       "      <td>-442278.333056</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>12071</th>\n",
       "      <td>113.863058</td>\n",
       "      <td>22.559462</td>\n",
       "      <td>8786.650220</td>\n",
       "      <td>18</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>0</td>\n",
       "      <td>-442286.875278</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>12072</th>\n",
       "      <td>113.863058</td>\n",
       "      <td>22.559462</td>\n",
       "      <td>9015.927232</td>\n",
       "      <td>1</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>0</td>\n",
       "      <td>-442298.386667</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>12073</th>\n",
       "      <td>113.863058</td>\n",
       "      <td>22.559462</td>\n",
       "      <td>9194.124308</td>\n",
       "      <td>2</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>0</td>\n",
       "      <td>-442308.541111</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>12074</th>\n",
       "      <td>113.863058</td>\n",
       "      <td>22.559462</td>\n",
       "      <td>9116.486957</td>\n",
       "      <td>1</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>0</td>\n",
       "      <td>-442318.454167</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>12075</th>\n",
       "      <td>113.870200</td>\n",
       "      <td>22.538085</td>\n",
       "      <td>9986.290081</td>\n",
       "      <td>5</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>0</td>\n",
       "      <td>-442320.330278</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>12076</th>\n",
       "      <td>113.870200</td>\n",
       "      <td>22.538085</td>\n",
       "      <td>9034.639784</td>\n",
       "      <td>5</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>0</td>\n",
       "      <td>-442320.330278</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>12077</th>\n",
       "      <td>113.863058</td>\n",
       "      <td>22.559462</td>\n",
       "      <td>9234.510388</td>\n",
       "      <td>1</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>0</td>\n",
       "      <td>-442322.935278</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>12078</th>\n",
       "      <td>113.863058</td>\n",
       "      <td>22.559462</td>\n",
       "      <td>8617.553328</td>\n",
       "      <td>21</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>0</td>\n",
       "      <td>-442324.211944</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>12079</th>\n",
       "      <td>113.863058</td>\n",
       "      <td>22.559462</td>\n",
       "      <td>8931.198320</td>\n",
       "      <td>23</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>0</td>\n",
       "      <td>-442329.244722</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>12080</th>\n",
       "      <td>113.863058</td>\n",
       "      <td>22.559462</td>\n",
       "      <td>9311.779852</td>\n",
       "      <td>1</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>0</td>\n",
       "      <td>-442334.017222</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>12081</th>\n",
       "      <td>113.863058</td>\n",
       "      <td>22.559462</td>\n",
       "      <td>9048.335018</td>\n",
       "      <td>1</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>0</td>\n",
       "      <td>-442348.713611</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>12082</th>\n",
       "      <td>113.863058</td>\n",
       "      <td>22.559462</td>\n",
       "      <td>9112.933367</td>\n",
       "      <td>23</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>0</td>\n",
       "      <td>-442350.956389</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>12083</th>\n",
       "      <td>113.863058</td>\n",
       "      <td>22.559462</td>\n",
       "      <td>9112.425992</td>\n",
       "      <td>1</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>0</td>\n",
       "      <td>-442384.025278</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>12084</th>\n",
       "      <td>114.275347</td>\n",
       "      <td>22.577700</td>\n",
       "      <td>9763.270804</td>\n",
       "      <td>19</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>0</td>\n",
       "      <td>-442411.420556</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>12085</th>\n",
       "      <td>113.863058</td>\n",
       "      <td>22.559462</td>\n",
       "      <td>9727.714780</td>\n",
       "      <td>21</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>0</td>\n",
       "      <td>-442415.021111</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>12086</th>\n",
       "      <td>113.863058</td>\n",
       "      <td>22.559462</td>\n",
       "      <td>8891.635626</td>\n",
       "      <td>1</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>0</td>\n",
       "      <td>-442437.098056</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>12087</th>\n",
       "      <td>114.275347</td>\n",
       "      <td>22.577700</td>\n",
       "      <td>8953.807900</td>\n",
       "      <td>2</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>0</td>\n",
       "      <td>-442449.689444</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>12088</th>\n",
       "      <td>113.863058</td>\n",
       "      <td>22.559462</td>\n",
       "      <td>8782.611250</td>\n",
       "      <td>23</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>0</td>\n",
       "      <td>-442471.429167</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>12089</th>\n",
       "      <td>113.863058</td>\n",
       "      <td>22.559462</td>\n",
       "      <td>9112.943514</td>\n",
       "      <td>1</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>0</td>\n",
       "      <td>-442484.751111</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>12090</th>\n",
       "      <td>113.863058</td>\n",
       "      <td>22.559462</td>\n",
       "      <td>8918.825920</td>\n",
       "      <td>18</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>0</td>\n",
       "      <td>-442486.440556</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>12091</th>\n",
       "      <td>113.870200</td>\n",
       "      <td>22.538085</td>\n",
       "      <td>9235.482700</td>\n",
       "      <td>5</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>0</td>\n",
       "      <td>-442490.995000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>12092</th>\n",
       "      <td>113.870200</td>\n",
       "      <td>22.538085</td>\n",
       "      <td>9631.071598</td>\n",
       "      <td>5</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>0</td>\n",
       "      <td>-442490.995000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>12093</th>\n",
       "      <td>113.863058</td>\n",
       "      <td>22.559462</td>\n",
       "      <td>8884.528639</td>\n",
       "      <td>5</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>0</td>\n",
       "      <td>-442501.583611</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>12094</th>\n",
       "      <td>113.863058</td>\n",
       "      <td>22.559462</td>\n",
       "      <td>9894.709740</td>\n",
       "      <td>23</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>0</td>\n",
       "      <td>-442530.068333</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>12095</th>\n",
       "      <td>113.863058</td>\n",
       "      <td>22.559462</td>\n",
       "      <td>9275.153910</td>\n",
       "      <td>1</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>0</td>\n",
       "      <td>-442531.205833</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>12096</th>\n",
       "      <td>113.863058</td>\n",
       "      <td>22.559462</td>\n",
       "      <td>8997.877069</td>\n",
       "      <td>1</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>0</td>\n",
       "      <td>-442553.966111</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>12097</th>\n",
       "      <td>114.275347</td>\n",
       "      <td>22.577700</td>\n",
       "      <td>9094.393056</td>\n",
       "      <td>19</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>0</td>\n",
       "      <td>-442595.286667</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>12098 rows × 9 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "       start_port_lon  start_port_lat      distance  carrierName  \\\n",
       "0          114.133970       22.315195   9381.593353            1   \n",
       "1          114.275347       22.577700   9132.095005            1   \n",
       "2          114.275347       22.577700   8584.984337            1   \n",
       "3          114.275347       22.577700   6740.987300            1   \n",
       "4          114.275347       22.577700   8251.765781            1   \n",
       "5          113.863058       22.559462   7069.425052            1   \n",
       "6          113.863058       22.559462   6884.420555            1   \n",
       "7          113.863058       22.559462   6766.630396            1   \n",
       "8          114.275347       22.577700   8686.503698            1   \n",
       "9          113.863058       22.559462   7044.603356            1   \n",
       "10         114.275347       22.577700   6452.721631            2   \n",
       "11         113.863058       22.559462   8846.784561            3   \n",
       "12         113.863058       22.559462   8898.597996            3   \n",
       "13         114.275347       22.577700   9447.684705            4   \n",
       "14         114.275347       22.577700   8260.702360            4   \n",
       "15         114.275347       22.577700   8880.048909            4   \n",
       "16         113.863058       22.559462   9852.285492            2   \n",
       "17         113.863058       22.559462  12463.688045            5   \n",
       "18         114.275347       22.577700  11234.436668            6   \n",
       "19         114.275347       22.577700   6005.370977            7   \n",
       "20         114.275347       22.577700   9122.493461            8   \n",
       "21         121.643646       31.344022   7289.392611            6   \n",
       "22         121.643646       31.344022   7164.135037            6   \n",
       "23         113.863058       22.559462   9719.521929            9   \n",
       "24         114.275347       22.577700   8794.886284            1   \n",
       "25         114.275347       22.577700   9509.003399            1   \n",
       "26         114.275347       22.577700   8940.389738            1   \n",
       "27         114.275347       22.577700   8788.071666            1   \n",
       "28         114.275347       22.577700   7823.185511            1   \n",
       "29         113.863058       22.559462   9654.244750            3   \n",
       "...               ...             ...           ...          ...   \n",
       "12068      113.863058       22.559462   9852.812495            1   \n",
       "12069      114.275347       22.577700   9759.911936           19   \n",
       "12070      113.863058       22.559462   8868.530498            1   \n",
       "12071      113.863058       22.559462   8786.650220           18   \n",
       "12072      113.863058       22.559462   9015.927232            1   \n",
       "12073      113.863058       22.559462   9194.124308            2   \n",
       "12074      113.863058       22.559462   9116.486957            1   \n",
       "12075      113.870200       22.538085   9986.290081            5   \n",
       "12076      113.870200       22.538085   9034.639784            5   \n",
       "12077      113.863058       22.559462   9234.510388            1   \n",
       "12078      113.863058       22.559462   8617.553328           21   \n",
       "12079      113.863058       22.559462   8931.198320           23   \n",
       "12080      113.863058       22.559462   9311.779852            1   \n",
       "12081      113.863058       22.559462   9048.335018            1   \n",
       "12082      113.863058       22.559462   9112.933367           23   \n",
       "12083      113.863058       22.559462   9112.425992            1   \n",
       "12084      114.275347       22.577700   9763.270804           19   \n",
       "12085      113.863058       22.559462   9727.714780           21   \n",
       "12086      113.863058       22.559462   8891.635626            1   \n",
       "12087      114.275347       22.577700   8953.807900            2   \n",
       "12088      113.863058       22.559462   8782.611250           23   \n",
       "12089      113.863058       22.559462   9112.943514            1   \n",
       "12090      113.863058       22.559462   8918.825920           18   \n",
       "12091      113.870200       22.538085   9235.482700            5   \n",
       "12092      113.870200       22.538085   9631.071598            5   \n",
       "12093      113.863058       22.559462   8884.528639            5   \n",
       "12094      113.863058       22.559462   9894.709740           23   \n",
       "12095      113.863058       22.559462   9275.153910            1   \n",
       "12096      113.863058       22.559462   8997.877069            1   \n",
       "12097      114.275347       22.577700   9094.393056           19   \n",
       "\n",
       "       speed_median  speed_mean  speed_max  acceleration        label_y  \n",
       "0               NaN         NaN        NaN             0 -440933.880278  \n",
       "1               NaN         NaN        NaN             0 -440958.204444  \n",
       "2               NaN         NaN        NaN             0 -440958.204444  \n",
       "3               NaN         NaN        NaN             0 -441164.149167  \n",
       "4               NaN         NaN        NaN             0 -440958.204444  \n",
       "5               NaN         NaN        NaN             0 -440958.204444  \n",
       "6               NaN         NaN        NaN             0 -440958.204444  \n",
       "7               NaN         NaN        NaN             0 -440958.204444  \n",
       "8               NaN         NaN        NaN             0 -440958.204444  \n",
       "9               NaN         NaN        NaN             0 -440958.204444  \n",
       "10              NaN         NaN        NaN             0 -441164.151111  \n",
       "11              NaN         NaN        NaN             0 -441115.159444  \n",
       "12              NaN         NaN        NaN             0 -441115.159444  \n",
       "13              NaN         NaN        NaN             0 -441124.892222  \n",
       "14              NaN         NaN        NaN             0 -441019.203333  \n",
       "15              NaN         NaN        NaN             0 -441019.203333  \n",
       "16              NaN         NaN        NaN             0 -440740.735556  \n",
       "17              NaN         NaN        NaN             0 -440972.325833  \n",
       "18              NaN         NaN        NaN             0 -440714.152778  \n",
       "19              NaN         NaN        NaN             0 -441164.154444  \n",
       "20              NaN         NaN        NaN             0 -441151.370833  \n",
       "21              NaN         NaN        NaN             0 -440923.397778  \n",
       "22              NaN         NaN        NaN             0 -440923.397778  \n",
       "23              NaN         NaN        NaN             0 -440999.717500  \n",
       "24              NaN         NaN        NaN             0 -440983.701111  \n",
       "25              NaN         NaN        NaN             0 -440983.701111  \n",
       "26              NaN         NaN        NaN             0 -440983.701111  \n",
       "27              NaN         NaN        NaN             0 -440983.701111  \n",
       "28              NaN         NaN        NaN             0 -440983.701111  \n",
       "29              NaN         NaN        NaN             0 -440643.030278  \n",
       "...             ...         ...        ...           ...            ...  \n",
       "12068           NaN         NaN        NaN             0 -442273.961111  \n",
       "12069           NaN         NaN        NaN             0 -442274.929444  \n",
       "12070           NaN         NaN        NaN             0 -442278.333056  \n",
       "12071           NaN         NaN        NaN             0 -442286.875278  \n",
       "12072           NaN         NaN        NaN             0 -442298.386667  \n",
       "12073           NaN         NaN        NaN             0 -442308.541111  \n",
       "12074           NaN         NaN        NaN             0 -442318.454167  \n",
       "12075           NaN         NaN        NaN             0 -442320.330278  \n",
       "12076           NaN         NaN        NaN             0 -442320.330278  \n",
       "12077           NaN         NaN        NaN             0 -442322.935278  \n",
       "12078           NaN         NaN        NaN             0 -442324.211944  \n",
       "12079           NaN         NaN        NaN             0 -442329.244722  \n",
       "12080           NaN         NaN        NaN             0 -442334.017222  \n",
       "12081           NaN         NaN        NaN             0 -442348.713611  \n",
       "12082           NaN         NaN        NaN             0 -442350.956389  \n",
       "12083           NaN         NaN        NaN             0 -442384.025278  \n",
       "12084           NaN         NaN        NaN             0 -442411.420556  \n",
       "12085           NaN         NaN        NaN             0 -442415.021111  \n",
       "12086           NaN         NaN        NaN             0 -442437.098056  \n",
       "12087           NaN         NaN        NaN             0 -442449.689444  \n",
       "12088           NaN         NaN        NaN             0 -442471.429167  \n",
       "12089           NaN         NaN        NaN             0 -442484.751111  \n",
       "12090           NaN         NaN        NaN             0 -442486.440556  \n",
       "12091           NaN         NaN        NaN             0 -442490.995000  \n",
       "12092           NaN         NaN        NaN             0 -442490.995000  \n",
       "12093           NaN         NaN        NaN             0 -442501.583611  \n",
       "12094           NaN         NaN        NaN             0 -442530.068333  \n",
       "12095           NaN         NaN        NaN             0 -442531.205833  \n",
       "12096           NaN         NaN        NaN             0 -442553.966111  \n",
       "12097           NaN         NaN        NaN             0 -442595.286667  \n",
       "\n",
       "[12098 rows x 9 columns]"
      ]
     },
     "execution_count": 38,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "train_data"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 36,
=======
   "execution_count": 5,
>>>>>>> 081c522bdcef1cb40c539a5a14ec6d26a3b53059
   "metadata": {},
   "outputs": [],
   "source": [
    "LR = 0.001\n",
    "epochs = 3000\n",
    "loss_func=torch.nn.MSELoss()\n",
    "DROP_OUT_RATE = 0.5\n",
    "\n",
    "class ModelForCorrect(torch.nn.Module):\n",
    "    def __init__(self):\n",
    "        \"\"\"\n",
    "        In the constructor we instantiate two nn.Linear modules and assign them as\n",
    "        member variables.\n",
    "        \"\"\"\n",
    "        super(ModelForCorrect, self).__init__()\n",
    "        self.dnn = torch.nn.Sequential(\n",
    "            torch.nn.Linear(8,128),\n",
    "            torch.nn.Dropout(DROP_OUT_RATE),\n",
    "            torch.nn.LeakyReLU(),\n",
    "            torch.nn.Linear(128,64),\n",
    "            torch.nn.Dropout(DROP_OUT_RATE),\n",
    "            torch.nn.LeakyReLU(),\n",
    "            torch.nn.Linear(64,1),\n",
    "        )\n",
    "\n",
    "    def forward(self, x):\n",
    "        \"\"\"\n",
    "        In the forward function we accept a Tensor of input data and we must return\n",
    "        a Tensor of output data. We can use Modules defined in the constructor as\n",
    "        well as arbitrary operators on Tensors.\n",
    "        \"\"\"\n",
    "        out = self.dnn(x)\n",
<<<<<<< HEAD
    "        print(x[0])\n",
    "        print(out)\n",
=======
>>>>>>> 081c522bdcef1cb40c539a5a14ec6d26a3b53059
    "        return(out)"
   ]
  },
  {
   "cell_type": "code",
<<<<<<< HEAD
   "execution_count": 37,
=======
   "execution_count": 6,
>>>>>>> 081c522bdcef1cb40c539a5a14ec6d26a3b53059
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
<<<<<<< HEAD
      "\r",
      "  0%|          | 0/3000 [00:00<?, ?it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "tensor([ 113.8631,   22.5595, 9685.1592,   22.0000,       nan,       nan,\n",
      "              nan,    0.0000])\n",
      "tensor([[nan],\n",
      "        [nan],\n",
      "        [nan],\n",
      "        ...,\n",
      "        [nan],\n",
      "        [nan],\n",
      "        [nan]], grad_fn=<AddmmBackward>)\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\n"
=======
      "100%|██████████| 3000/3000 [00:11<00:00, 250.51it/s]\n"
>>>>>>> 081c522bdcef1cb40c539a5a14ec6d26a3b53059
     ]
    }
   ],
   "source": [
    "modelForCorrect = ModelForCorrect()\n",
    "optimizer = torch.optim.Adam(modelForCorrect.parameters(), lr=LR,weight_decay=5e-3)\n",
    "#Training in batches\n",
    "train_losses = []\n",
    "val_losses = []\n",
    "for step in tqdm(range(epochs)):    \n",
    "    modelForCorrect.train()\n",
    "    out = modelForCorrect(X_train).reshape(-1)                 # input x and predict based on x\n",
<<<<<<< HEAD
    "#     print(X_train, Y_train, out)\n",
    "    break\n",
=======
>>>>>>> 081c522bdcef1cb40c539a5a14ec6d26a3b53059
    "    cost = loss_func(out, Y_train) \n",
    "    optimizer.zero_grad()   # clear gradients for next train\n",
    "    cost.backward()         # backpropagation, compute gradients\n",
    "    optimizer.step()        # apply gradients \n",
    "    if step % 100 == 0:        \n",
    "        modelForCorrect.eval()\n",
    "        train_out = modelForCorrect(X_train).reshape(-1)\n",
    "        train_cost = loss_func(train_out, Y_train) \n",
    "        train_losses.append(train_cost.data)\n",
    "        val_out = modelForCorrect(X_val).reshape(-1)\n",
    "        val_cost = loss_func(val_out, Y_val) \n",
<<<<<<< HEAD
    "        val_losses.append(val_cost.data)\n",
    "#         print(train_out, val_out)"
=======
    "        val_losses.append(val_cost.data)"
>>>>>>> 081c522bdcef1cb40c539a5a14ec6d26a3b53059
   ]
  },
  {
   "cell_type": "code",
<<<<<<< HEAD
   "execution_count": 23,
=======
   "execution_count": 7,
>>>>>>> 081c522bdcef1cb40c539a5a14ec6d26a3b53059
   "metadata": {},
   "outputs": [
    {
     "data": {
<<<<<<< HEAD
      "image/png": "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\n",
=======
      "image/png": "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\n",
>>>>>>> 081c522bdcef1cb40c539a5a14ec6d26a3b53059
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
<<<<<<< HEAD
     "metadata": {},
=======
     "metadata": {
      "needs_background": "light"
     },
>>>>>>> 081c522bdcef1cb40c539a5a14ec6d26a3b53059
     "output_type": "display_data"
    }
   ],
   "source": [
    "# Loss curve\n",
    "plt.plot(train_losses)\n",
    "plt.plot(val_losses)\n",
    "plt.title('Loss')\n",
    "plt.legend(['train', 'validation'])\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
<<<<<<< HEAD
   "execution_count": 24,
=======
   "execution_count": 8,
>>>>>>> 081c522bdcef1cb40c539a5a14ec6d26a3b53059
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
<<<<<<< HEAD
      "/home/ma-user/anaconda3/envs/Pytorch-1.0.0/lib/python3.6/site-packages/torch/serialization.py:250: UserWarning: Couldn't retrieve source code for container of type ModelForCorrect. It won't be checked for correctness upon loading.\n",
=======
      "D:\\Program\\Anaconda\\envs\\AI\\lib\\site-packages\\torch\\serialization.py:360: UserWarning: Couldn't retrieve source code for container of type ModelForCorrect. It won't be checked for correctness upon loading.\n",
>>>>>>> 081c522bdcef1cb40c539a5a14ec6d26a3b53059
      "  \"type \" + obj.__name__ + \". It won't be checked \"\n"
     ]
    }
   ],
   "source": [
    "torch.save(modelForCorrect, model_for_correct_test_data_path)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
<<<<<<< HEAD
   "display_name": "Pytorch-1.0.0",
   "language": "python",
   "name": "pytorch-1.0.0"
=======
   "display_name": "Python 3.7.6 64-bit ('AI': conda)",
   "language": "python",
   "name": "python37664bitaiconda6859e03b37c34f0182c9bde8073269f7"
>>>>>>> 081c522bdcef1cb40c539a5a14ec6d26a3b53059
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
<<<<<<< HEAD
   "version": "3.6.4"
=======
   "version": "3.7.6"
>>>>>>> 081c522bdcef1cb40c539a5a14ec6d26a3b53059
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
